home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / ddj0897.zip / RCSC.ASC < prev    next >
Text File  |  1997-06-20  |  4KB  |  300 lines

  1. _Retargetable Concurrent Small C_
  2. by Andy Yuen
  3.  
  4. Example 1:
  5.  
  6. (a) 
  7. macroname(arg1, arg2,..., argn)
  8.  
  9. (b)
  10. define(`OPxy',
  11. `MOV A,$3
  12. ifelse(len($5), 0, `$1 A', `$1 A,$5')
  13. MOV $3,A
  14. MOV A,$4
  15. ifelse(len($6), 0, `$1 A', `$2 A,$6')
  16. MOV $4,A')
  17.  
  18. Example 2:
  19.  
  20. (a)
  21. OPxy(ADD, ADDC, R3, R2, R5, R4)
  22.  
  23. (b)
  24. MOV A,R3
  25. ADD A,R5
  26. MOV R3,A
  27. MOV A,R2
  28. ADDC    A,R4
  29. MOV R2,A
  30.  
  31. Example 3:
  32.  
  33. __intr_1:
  34. LCALL   __handler       ;;common interrupt handler
  35. DW      __dodelta       ;;user interrupt function
  36. DW      1               ;;interrupt number
  37.  
  38. Example 4: (a) 80x86 version; (b) 8051 version
  39.  
  40.  
  41.  
  42. (a)
  43. vargfunc(argc) int argc; {
  44.     int *nxtarg;
  45.     int *ptr, *ctl;
  46.  
  47.     /* get pointer to first argument */
  48.     nxtarg = CCARGC() + &argc - 1;
  49.     ...
  50.     /* get first argument */
  51.     ptr = *nxtarg--;
  52.     ...
  53.     /* get next argument */
  54.     ctl = *nxtarg--;
  55.     ...
  56. }
  57.  
  58. (b)
  59. vargfunc(argc) int argc; {
  60.     int *nxtarg;
  61.     int *ptr, *ctl;
  62.  
  63.     /* get pointer to first argument */
  64.     nxtarg = &argc - CCARGC() + 1;
  65.     ...
  66.     /* get first argument */
  67.     ptr = *nxtarg++;
  68.     ...
  69.     /* get next argument */
  70.     ctl = *nxtarg++;
  71.     ...
  72. }
  73.  
  74. Example 5: 
  75.  
  76. (a)
  77. vargfunc(argc) int argc; {
  78.     va_list nxtarg;
  79.     int *ptr, *ctl;
  80.  
  81.     /* get pointer to first argument */
  82.     va_start(nxtarg, argc);
  83.     ...
  84.     /* get first argument */
  85.     ptr = va_arg(nxtarg, int);
  86.     ...
  87.     /* get next argument */
  88.     ctl = va_arg(nxtarg, int);
  89.     ...
  90. }
  91.  
  92.  
  93. Listing One
  94. /*  ** copy t to s  */
  95. strcpy(s, t) char *s, *t; {
  96.  
  97.   char *d;
  98.   d = s;
  99.   while (*s++ = *t++) ;
  100.   return (d);
  101.   }
  102.  
  103. Listing Two
  104. TOSEG(2)
  105. CSCEXTRN
  106. ENDSEG(2)
  107. TOSEG(1)
  108. ENDSEG(1)
  109. TOSEG(2)
  110. DECLPUBLIC(_strcpy, 2)
  111. ENTER
  112. ADDSP(-2)
  113. GETw1s(6)
  114. POINT2s(-2)
  115. PUTwp1
  116. LABm(_2:)
  117. POINT2s(6)
  118. GETw1p(0)
  119. INCwp
  120. PUSH1
  121. POINT2s(4)
  122. GETw1p(0)
  123. INCwp
  124. MOVE21
  125. GETb1p(0)
  126. POP2
  127. PUTbp1
  128. NE10f(_3)
  129. JMPm(_2)
  130. LABm(_3:)
  131. GETw1s(-2)
  132. RETURN(2)
  133. ENDSEG(2)
  134. END
  135.  
  136. Listing Three
  137. CODE SEGMENT PUBLIC
  138. ASSUME CS:CODE, SS:DATA, DS:DATA
  139. extrn __eq: near
  140. extrn __ne: near
  141. extrn __le: near
  142. extrn __lt: near
  143. extrn __ge: near
  144. extrn __gt: near
  145. extrn __ule: near
  146. extrn __ult: near
  147. extrn __uge: near
  148. extrn __ugt: near
  149. extrn __lneg: near
  150. extrn __switch: near
  151. CODE ENDS
  152.  
  153.  DATA SEGMENT PUBLIC
  154. DATA ENDS
  155.  CODE SEGMENT PUBLIC
  156. ASSUME CS:CODE, SS:DATA, DS:DATA
  157. PUBLIC _strcpy
  158. _strcpy:
  159. PUSH BP
  160. MOV BP,SP
  161. ADD SP,-2
  162. MOV AX,6[BP]
  163. LEA BX,-2[BP]
  164. MOV [BX],AX
  165. _2:
  166. LEA BX,6[BP]
  167. MOV AX,[BX]
  168. INC WORD PTR [BX]
  169. PUSH AX
  170. LEA BX,4[BP]
  171. MOV AX,[BX]
  172. INC WORD PTR [BX]
  173. MOV BX,AX
  174. MOV AL,[BX]
  175. CBW
  176. POP BX
  177. MOV [BX],AL
  178. OR AX,AX
  179. JNE $+5
  180. JMP _3
  181. JMP _2
  182. _3:
  183. MOV AX,-2[BP]
  184. MOV SP,BP
  185. POP BP
  186. RET
  187. CODE ENDS
  188. END
  189.  
  190. Listing Four
  191. SEG CODE 
  192. include "runtime.i"
  193.  
  194. SEG XDATA AT MNAME_var_at 
  195. SEG CODE 
  196.  
  197. PUBLIC _strcpy:
  198.  
  199. ;;ENTER
  200. POP B
  201. POP ACC
  202. LCALL __enter
  203.  
  204. ;;ADDSP(-2)
  205.  
  206. MOV DPTR,# 2
  207. LCALL __addsp
  208.  
  209. ;;GETw1s(6)
  210. MOV DPTR,# -3
  211. LCALL __getw1s
  212. ;;POINT2s(-2)
  213. MOV DPTR,# 5
  214. LCALL __point2s
  215. ;;PUTwp1
  216. MOV DPL,R5
  217. MOV DPH,R4
  218. MOV A,R2
  219. MOVX @DPTR,A
  220. INC DPTR
  221. MOV A,R3
  222. MOVX @DPTR,A
  223.  
  224. _2:
  225. ;;POINT2s(6)
  226. MOV DPTR,# -3
  227. LCALL __point2s
  228. ;;GETw1p(0)
  229. MOV DPTR,# 0
  230. LCALL __getw1p
  231. ;;INCwp
  232. MOV DPL,R5
  233. MOV DPH,R4
  234. INC DPTR
  235. MOVX A,@DPTR
  236. ADD A,#1
  237. MOVX @DPTR,A
  238. MOV DPL,R5
  239. MOV DPH,R4
  240. MOVX A,@DPTR
  241. ADDC A,#0
  242. MOVX @DPTR,A
  243. ;;PUSH1
  244. LCALL __push1
  245. ;;POINT2s(4)
  246. MOV DPTR,# -1
  247. LCALL __point2s
  248. ;;GETw1p(0)
  249. MOV DPTR,# 0
  250. LCALL __getw1p
  251. ;;INCwp
  252. MOV DPL,R5
  253. MOV DPH,R4
  254. INC DPTR
  255. MOVX A,@DPTR
  256. ADD A,#1
  257. MOVX @DPTR,A
  258. MOV DPL,R5
  259. MOV DPH,R4
  260. MOVX A,@DPTR
  261. ADDC A,#0
  262. MOVX @DPTR,A
  263. ;;MOVE21
  264.  
  265. MOV A,R3
  266. MOV R5,A
  267. MOV A,R2
  268. MOV R4,A
  269. ;;GETb1p(0)
  270. MOV DPTR,# 0
  271. LCALL __getb1p
  272. ;;POP2
  273. LCALL __pop2
  274. ;;PUTbp1
  275. MOV DPL,R5
  276. MOV DPH,R4
  277. MOV A,R3
  278. MOVX @DPTR,A
  279. ;;NE10f
  280. MOV A,R3
  281. ORL A,R2
  282. JNZ $+5
  283. LJMP _3
  284. ;;JMPm(_2)
  285. LJMP _2
  286.  
  287. _3:
  288. ;;GETw1s(-2)
  289. MOV DPTR,# 5
  290. LCALL __getw1s
  291. ;;RETURN(2) 
  292. MOV DPTR,# -2-4
  293. LJMP __return
  294.  
  295. END
  296.  
  297.  
  298.  
  299.  
  300.